
#include <windows.h>
#include <mmsystem.h>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;

#include "GL/GL.H"
#include "GL/GLAUX.H"
#include "GL/glut.h"

/********/

#include "NebeskoTelo.h"
#include "Tekstura.h"

/********/

long  prethodno_vreme = 0;

GLfloat AmbijentalnoSvetlo[]=	{ 0.1f, 0.1f, 0.1f, 1.0f };
GLfloat DifuznoSvetlo[]=	{ 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat PozicijaSvetla[]=	{ 0.0f, 0.0f, 0.0f, 1.0f };



Zvezda *Sunce;

void oslobodi()
{
      delete Sunce;
}


void reshape(int width, int height)
{

  // postavljanje velicine prikaznog prozora
  glViewport(0, 0, (GLint) width, (GLint) height);

  // aktiviranje matrice projekcije
  // kao matrice na koju ce se primenjivati buduce transformacije
  glMatrixMode(GL_PROJECTION);

  // Postavljanje matrice projekcije na jedinicnu
  glLoadIdentity();

  gluPerspective(40, (GLfloat)width/(GLfloat)height, 1, 1200);

  // izbor matrice transformacije pogleda i modela
  // kao matrice na koju ce se primenjivati buduce transformacije
  glMatrixMode(GL_MODELVIEW);
}


void mouse_motion(int x, int y)
{
}

void mouse_action(int button, int state, int x, int y)
{
	switch(button)
	{
		case GLUT_LEFT_BUTTON:
			switch(state)
			{
				case GLUT_DOWN:
					break;

                        case GLUT_UP:
					break;
			}
			break;

		case GLUT_RIGHT_BUTTON:
			switch(state)
			{
				case GLUT_DOWN:
					break;

				case GLUT_UP:
					break;
			}
			break;
	}
}


void special_key_down(int key, int x, int y)
{
	switch(key)
	{
		case GLUT_KEY_UP:
			break;

		case GLUT_KEY_DOWN:
			break;

		case GLUT_KEY_LEFT:
			break;

		case GLUT_KEY_RIGHT:
			break;

            case GLUT_KEY_F1:
                  break;

            case GLUT_KEY_F2:
                  break;

            case GLUT_KEY_F3:
                  break;

            case GLUT_KEY_F4:
                  break;
	}
}

void key_down(unsigned char key, int x, int y)
{
	switch(key)
	{
		// ESC
		case 27:
                  oslobodi();
			exit(0);
			break;

		// razmak
		case 32:
			break;

		case '1':
			break;
	}
}


void init_all(void)
{
  glClearColor (0.0, 0.0, 0.0, 0.0);
  glShadeModel (GL_SMOOTH);

  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_NORMALIZE);

  glLightfv(GL_LIGHT1, GL_AMBIENT, AmbijentalnoSvetlo);
  glLightfv(GL_LIGHT1, GL_DIFFUSE, DifuznoSvetlo);
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, AmbijentalnoSvetlo); 

  glEnable(GL_LIGHT1);

  srand(time(NULL));

  Sunce = new Zvezda(12, 0.005f,new BMPTekstura2D("teksture/gzvezda.bmp"));
  Sunce->rezervisiSatelite(8);
  Sunce->dodajSatelit(new Planeta(0.3f, 0.05f, 0.05f, 14, new BMPTekstura2D("teksture/merkur.bmp")));
  Sunce->dodajSatelit(new Planeta(0.93f, 0.03f, 0.03f, 24, new BMPTekstura2D("teksture/venera.bmp")));
  Planeta* zemlja = new Planeta(1, 0.01f, 0.01f, 35, new BMPTekstura2D("teksture/zemlja.bmp"));
  zemlja->rezervisiSatelite(1);
  zemlja->dodajSatelit(new Planeta(0.3f, 0.1f, 0.1f, 2, new BMPTekstura2D("teksture/mesec.bmp")));
  Sunce->dodajSatelit(zemlja);
  Sunce->dodajSatelit(new Planeta(0.88f, 0.007f, 0.007f, 43, new BMPTekstura2D("teksture/mars.bmp")));
  Sunce->dodajSatelit(new Planeta(6.5f, 0.002f, 0.002f, 60, new BMPTekstura2D("teksture/jupiter.bmp")));
  Sunce->dodajSatelit(new Planeta(4.7f, 0.0009f, 0.0009f, 100, new BMPTekstura2D("teksture/saturn.bmp")));
  Sunce->dodajSatelit(new Planeta(3.3f, 0.0005f, 0.0005f, 150, new BMPTekstura2D("teksture/uran.bmp")));
  Sunce->dodajSatelit(new Planeta(2.7f, 0.0003f, 0.0003f, 190, new BMPTekstura2D("teksture/neptun.bmp")));
// Pluton je 2007. godine izbacen sa spiska planeta !

}


void draw(void)
{
  // Obrisi kolor i Z bafer
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  // postavi matricu transformacije modela i pogleda na jedinicnu
  glLoadIdentity();


  gluLookAt(-70, 40, 30, 50, 0, 0, 0, 1, 0);

  glLightfv(GL_LIGHT1, GL_POSITION, PozicijaSvetla);

  long proteklo = 0;
  if( prethodno_vreme != 0 )
  {
      proteklo = timeGetTime() - prethodno_vreme;

      if( proteklo < 40 )
      {
            Sleep( 40-proteklo );
	      glFinish();
	      return;
      }
  }
  else
	  prethodno_vreme = timeGetTime();

  Sunce->crtaj();
  Sunce->pomeri(proteklo);

  prethodno_vreme += proteklo;

  glFinish();
  glutSwapBuffers();
}



int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  glutInitWindowSize(500, 500);
  glutInitWindowPosition(100, 100);
  glutCreateWindow(argv[0]);
  init_all();
  glutDisplayFunc(draw);
  glutIdleFunc(draw);
  glutReshapeFunc(reshape);
  glutKeyboardFunc(key_down);
  glutSpecialFunc(special_key_down);
  glutMouseFunc( mouse_action );
  glutMotionFunc( mouse_motion );
  glutPassiveMotionFunc( mouse_motion );
  glutSetCursor(GLUT_CURSOR_FULL_CROSSHAIR);
  //glutFullScreen();
  glutMainLoop();

  return 0;
}
